<template>
  <editor
    v-model="myValue"
    :init="init"
    :disabled="disabled"
    :id="tinymceId"
    style="width:100%"
  ></editor>

  <el-upload
    style="width:100%;margin-top: -20px;"
    v-model="fileList"
    class="upload-demo"
    :headers = headers
    :action='realUploadUrl'
    :on-success="handleSuccess"
    :on-remove="handleRemove"
    :on-change="handleChange"
    :before-upload="handleBeforeUpload"
    :accept="acceptType"
    :file-list="fileList"
    :show-file-list="true"
    :key="tinymceId"
    :on-exceed="handleExceed"
    :limit="limitNum"
    :on-preview="handlePreview"
  >
    <div id="fileUploadDiv"></div>
  </el-upload>
  <!-- <div>
    <div v-for="item in fileList" :key="item.uid">
      {{ item.attachmentName }}
    </div>
  </div> -->
</template>

<script setup>
import { getToken } from '@/utils/auth'
import { ElLoading } from 'element-plus'
//JS部分
//在js中引入所需的主题和组件
import tinymce from "tinymce/tinymce";
import "tinymce/skins/content/default/content.css";
import Editor from "@tinymce/tinymce-vue";
import "tinymce/themes/silver";
import "tinymce/themes/silver/theme";
import "tinymce/icons/default"; //引入编辑器图标icon，不引入则不显示对应图标
import "tinymce/models/dom"; // 这里是个坑 一定要引入
import { ElMessage } from "element-plus";
//在TinyMce.vue中接着引入相关插件
import "tinymce/icons/default/icons";
import "tinymce/plugins/image"; // 插入上传图片插件
import "tinymce/plugins/media"; // 插入视频插件
import "tinymce/plugins/table"; // 插入表格插件
// import "tinymce/plugins/link" // 插入链接插件
import "tinymce/plugins/lists"; // 列表插件
import "tinymce/plugins/wordcount"; // 字数统计插件
import "tinymce/plugins/code"; // 源码
// import "tinymce/plugins/fullscreen" //全屏

//接下来定义编辑器所需要的插件数据
import { reactive, ref } from "vue";
import { onMounted, defineEmits, watch, computed, nextTick } from "@vue/runtime-core";
import axios from "@/utils/request";
let downloadLoadingInstance;
const { proxy } = getCurrentInstance();
const props = defineProps({
  limitNum: {
    type: Number,
    default: 1
  },
  acceptType: {
    type: String,
    default:()=>{
      return '.jpg,.jpeg,.png,.doc,.docx,.ppt,.pptx,.txt,.rar,.zip,.pdf,.xls,.xlsx'
    }
  },
  PropsFileList: {
    type: Array,
    default:()=>{
      return []
    }
  },
  uploadUrl: {
    type: String,
    default: ()=>{
      return '/train/notice/upload'
    }
  },
  value: {
    type: String,
    default: () => {
      return "";
    },
  },
  baseUrl: {
    type: String,
    default: "",
  },
  disabled: {
    type: Boolean,
    default: false,
  },
  plugins: {
    type: [String, Array],
    default: "lists table  ",
  }, //必填
  toolbar: {
    type: [String, Array],
    default:
      "codesample bold italic underline alignleft aligncenter alignright alignjustify | undo redo | formatselect | fontselect | fontsizeselect | forecolor backcolor | bullist numlist outdent indent | lists link table code | removeformat fileUpload",
  }, //必填
});
const realUploadUrl = ref(import.meta.env.VITE_APP_BASE_API + props.uploadUrl)
// import { updateImg } from '@/api/order/order'
const emits = defineEmits(["getContent"]);
//这里我选择将数据定义在props里面，方便在不同的页面也可以配置出不同的编辑器，当然也可以直接在组件中直接定义
const { acceptType, PropsFileList  } = toRefs(props)
// 文件上传相关
const fileList = ref([])
//用于接收外部传递进来的富文本
const myValue = ref(props.value);
const tinymceId = ref(
  "vue-tinymce-" + +new Date() + ((Math.random() * 1000).toFixed(0) + "")
);
//定义一个对象 init初始化
const init = reactive({
  selector: "#" + tinymceId.value, //富文本编辑器的id,
  language_url: "/tinymce/langs/zh_CN.js", // 语言包的路径
  language: "zh_CN", //语言
  skin_url: "/tinymce/skins/ui/oxide", // skin路径
  height: 400, //编辑器高度
  branding: false, //是否禁用“Powered by TinyMCE”
  menubar: false, //顶部菜单栏显示
  image_dimensions: false, //去除宽高属性
  plugins: props.plugins, //这里的数据是在props里面就定义好了的
  toolbar: props.toolbar, //这里的数据是在props里面就定义好了的
  font_formats:
    "Arial=arial,helvetica,sans-serif; 宋体=SimSun; 微软雅黑=Microsoft Yahei; Impact=impact,chicago;", //字体
  fontsize_formats: "11px 12px 14px 16px 18px 24px 36px 48px 64px 72px", //文字大小
  // paste_convert_word_fake_lists: false, // 插入word文档需要该属性
  paste_webkit_styles: "all",
  paste_merge_formats: true,
  nonbreaking_force_tab: false,
  paste_auto_cleanup_on_paste: false,
  file_picker_types: "file", // file , image, media 可选
  content_css: "/tinymce/skins/content/default/content.css", //以css文件方式自定义可编辑区域的css样式，css文件需自己创建并引入
  setup: function (editor) {
    editor.ui.registry.addButton("fileUpload", {
      text: "附件",
      icon: "Upload",
      onAction: function () {
        document.getElementById('fileUploadDiv').click()
      },
    });
  },
  //图片上传
  // images_upload_handler: (blobInfo, progress) =>
  //   new Promise((resolve, reject) => {
  //     if (blobInfo.blob().size / 1024 / 1024 > 2) {
  //       reject({ message: "上传失败，图片大小请控制在 2M 以内", remove: true });
  //       return;
  //     } else {
  //       const ph =
  //         import.meta.env.VITE_BASE_PATH +
  //         ":" +
  //         import.meta.env.VITE_SERVER_PORT +
  //         "/";
  //       let params = new FormData();
  //       params.append("file", blobInfo.blob());

  //       let config = {
  //         headers: {
  //           "Content-Type": "multipart/form-data",
  //         },
  //       };

  //       axios
  //         .post("xxxx", params, config)
  //         .then((res) => {
  //           if (res.data.code == 200) {
  //             resolve(ph + res.data.msg); //上传成功，在成功函数里填入图片路径
  //           } else {
  //             reject("HTTP Error: 上传失败" + res.data.code);
  //             return;
  //           }
  //         })
  //         .catch(() => {
  //           reject("上传出错，服务器开小差了呢");
  //           return;
  //         });
  //     }
  //   }),

  // 文件上传
  file_picker_callback: (callback, value, meta) => {
    // Provide file and text for the link dialog
    if (meta.filetype == "file") {
      callback("mypage.html", { text: "My text" });
    }

    // Provide image and alt text for the image dialog
    if (meta.filetype == "image") {
      callback("myimage.jpg", { alt: "My alt text" });
    }

    // Provide alternative source and posted for the media dialog
    if (meta.filetype == "media") {
      callback("movie.mp4", { source2: "alt.ogg", poster: "image.jpg" });
    }
  },
});

//监听外部传递进来的的数据变化
watch(
  () => props.value,
  () => {
    myValue.value = props.value;
    emits("getContent", myValue.value);
  }
);
//监听富文本中的数据变化
watch(
  () => myValue.value,
  () => {
    emits("getContent", myValue.value);
  }
);
//监听文件的数据变化
watch(
  () => fileList.value.length,
  () => {
    emits("getFileList", fileList.value);
  }
), {immediate: true};

watch(
  () => PropsFileList.value,
  () => {
    fileList.value = PropsFileList.value
  }
), {immediate: true};


//在onMounted中初始化编辑器
onMounted(() => {
  tinymce.init({});
  nextTick(()=>{
    fileList.value = PropsFileList.value
  })
});
const headers = computed(()=>{
  return {
    Authorization: 'Bearer ' + getToken()
  }
})
const handleBeforeUpload = (rawFile) => {
  if(rawFile.name.length - rawFile.name.split('.').pop().length > 100){
    ElMessage.error("上传的文件名最长100个字符");
    return false
  }
  if(!acceptType.value.includes(rawFile.name.split('.').pop().toLowerCase())){
    ElMessage.error(`${rawFile.name.split('.').pop()}格式不允许上传`);
    return false
  }
  if(rawFile.size==0){
    ElMessage.error("上传的文件大小必须有内容！");
    return false
  }
  if(rawFile.size>209715200){
    ElMessage.error("上传的文件不能超过200M");
    return false
  }

  downloadLoadingInstance = ElLoading.service({ text: "正在上传文件，请稍候", background: "rgba(0, 0, 0, 0.7)", })
}
const handleSuccess = (response, uploadFile, uploadFiles) => {
  fileList.value = uploadFiles
  emits("getFileListChange", true);
  downloadLoadingInstance.close();
}
const handleRemove = (uploadFile, uploadFiles) =>{
  fileList.value = uploadFiles
  emits("getFileListChange", true);
}
const handleChange = () =>{
  emits("getFileListChange", true);
}
const handleExceed = () =>{
  ElMessage.error(`只可以上传${props.limitNum}个文件，请删除后重新上传`);
}
const handlePreview = (uploadFile) =>{
  if(uploadFile.response.attachmentSign){
    proxy.downloadCommonFile(
      {
        sn: uploadFile.response.attachmentSign,
        path: uploadFile.response.attachmentPath
      },
      uploadFile.response.attachmentName
    )
  } else if(uploadFile.response.sign){
    proxy.downloadCommonFile(
      {
        sn: uploadFile.response.sign,
        path: uploadFile.response.filePath
      },
      uploadFile.response.fileName
    )
  }

}
</script>

